⛓️ Express 미들웨어 체인 이해하기
Express의 핵심은 요청이 여러 미들웨어 함수를 순서대로 거쳐가는 구조입니다.
1️⃣ 기본 구조
app.use((req, res, next) => {
console.log("1번 미들웨어");
next(); // 다음 미들웨어로 넘김
});
app.use((req, res, next) => {
console.log("2번 미들웨어");
next();
});
app.get("/", (req, res) => {
res.send("응답 완료");
});
next()를 호출하지 않으면 요청이 다음 단계로 넘어가지 않고 그대로 멈춤
2️⃣ 에러 처리 미들웨어
app.use((req, res, next) => {
try {
riskyOperation();
next();
} catch (err) {
next(err); // 인자가 있으면 에러 처리 미들웨어로 바로 이동
}
});
// 매개변수가 4개인 미들웨어는 Express가 자동으로 에러 핸들러로 인식
app.use((err, req, res, next) => {
res.status(500).json({ message: err.message });
});
next(err)를 호출하면 일반 미들웨어들을 건너뛰고 에러 처리 미들웨어로 바로 이동
3️⃣ 특정 경로에만 적용하기
function authMiddleware(req, res, next) {
if (!req.headers.authorization) {
return res.status(401).json({ message: "Unauthorized" });
}
next();
}
app.use("/admin", authMiddleware); // /admin으로 시작하는 요청에만 적용
- 미들웨어는 전체 앱뿐 아니라 특정 경로/라우터 단위로도 선택적으로 적용 가능
4️⃣ 실행 순서의 중요성
- 미들웨어는 등록된 순서대로 실행되므로, 인증 미들웨어는 실제 라우트 핸들러보다 반드시 먼저 등록해야 함
- 로깅처럼 모든 요청에 적용할 미들웨어는 라우트보다 최상단에 배치하는 것이 일반적
✍️ 한 줄 정리
Express는 등록 순서대로 미들웨어를 거치는 체인 구조이며, next()로 다음 단계로 넘기고 next(err)로 에러 처리 미들웨어로 분기할 수 있다.